package br.com.petsis.entity;

// Generated 18/05/2011 10:52:24 by Hibernate Tools 3.3.0.GA

import static javax.persistence.GenerationType.IDENTITY;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PostLoad;
import javax.persistence.PostPersist;
import javax.persistence.PostRemove;
import javax.persistence.PostUpdate;
import javax.persistence.PrePersist;
import javax.persistence.PreRemove;
import javax.persistence.PreUpdate;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.validator.NotNull;
import org.jboss.seam.Component;

import br.com.petsis.enumerations.TipoOperacaoEnum;
import br.com.petsis.funcionalidades.auditoria.AuditoriaController;

/**
 * Pet generated by hbm2java
 */
@Entity
@Table(name = "perfil_funcionalidade")
public class PerfilFuncionalidade implements java.io.Serializable {
	
	public static final String PERFIL_PETSHOP = "PETSHOP";
	public static final String PERFIL_VETERINARIA = "VETERINARIA";

	private Integer idPerfilFuncionalidade;
	private Perfil perfil;
	private Funcionalidade funcionalidade;
	private Character flgLeitura;
	private Character flgGravacao;
	private Character flgExclusao;
	private Character flgDesconto;
	
	@Transient
	private boolean flgControleTotal;
	private boolean leitura;
	private boolean gravacao;
	private boolean exclusao;
	private boolean desconto;
	
	@Transient
	private boolean selecionado;
	
	@Transient
	private Integer idFuncionalidade;
	
	@Transient
	private TipoOperacaoEnum tipoOperacao;
	
	@Transient
	private String dadosAntigos;
	
	@PostLoad
	public void registrarDadosAntigos(){
		AuditoriaController auditoriaController = (AuditoriaController)Component.getInstance("auditoriaController");
		dadosAntigos = auditoriaController.recuperaDadosConcatenados(this);
	}
	
	@PostPersist
	@PostUpdate
	@PostRemove
	public void registrarAuditoria(){
		AuditoriaController auditoriaController = (AuditoriaController)Component.getInstance("auditoriaController");
		auditoriaController.registraLogAuditoria(this, tipoOperacao, dadosAntigos);
	}
	
	@PrePersist
	public void registrarTipoOperacaoInclusao(){
		tipoOperacao = TipoOperacaoEnum.INCLUSAO;
	}

	@PreRemove
	public void registrarTipoOperacaoExcluir(){
		tipoOperacao = TipoOperacaoEnum.EXCLUSAO;
	}
	
	@PreUpdate
	public void registrarTipoOperacaoAlteracao(){
		tipoOperacao = TipoOperacaoEnum.ALTERACAO;
	}
	
	public PerfilFuncionalidade() {
	}
	
	public PerfilFuncionalidade(PerfilFuncionalidade pf) {
		this.perfil = pf.getPerfil();
		this.funcionalidade = pf.getFuncionalidade();
		this.idFuncionalidade = pf.getIdFuncionalidade();
		this.desconto = pf.isDesconto();
		this.exclusao = pf.isExclusao();
		this.gravacao = pf.isGravacao();
		this.leitura = pf.isLeitura();
		this.flgControleTotal = pf.isFlgControleTotal();
		this.flgDesconto = pf.getFlgDesconto();
		this.flgExclusao = pf.getFlgExclusao();
		this.flgGravacao = pf.getFlgGravacao();
		this.flgLeitura = pf.getFlgLeitura();
	}
	
	public void atualizaFlags(){
		setFlgLeitura(isLeitura() ? 'T' : 'F');
		setFlgGravacao(isGravacao() ? 'T' : 'F');
		setFlgExclusao(isExclusao() ? 'T' : 'F');
		setFlgDesconto(isDesconto() ? 'T' : 'F');
	}
	
	public void atualizaChecks(){
		setLeitura(getFlgLeitura().equals('T') ? true : false);
		setGravacao(getFlgGravacao().equals('T') ? true : false);
		setExclusao(getFlgExclusao().equals('T') ? true : false);
		setDesconto(getFlgDesconto().equals('T') ? true : false);
	}
	
	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "ID_PERFIL_FUNCIONALIDADE", unique = true, nullable = false)
	public Integer getIdPerfilFuncionalidade() {
		return idPerfilFuncionalidade;
	}

	public void setIdPerfilFuncionalidade(Integer idPerfilFuncionalidade) {
		this.idPerfilFuncionalidade = idPerfilFuncionalidade;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_PERFIL", nullable = false)
	@NotNull
	public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_FUNCIONALIDADE", nullable = false)
	@NotNull
	public Funcionalidade getFuncionalidade() {
		return funcionalidade;
	}

	public void setFuncionalidade(Funcionalidade funcionalidade) {
		this.funcionalidade = funcionalidade;
	}

	@Column(name = "flg_leitura", nullable = false)
	public Character getFlgLeitura() {
		return flgLeitura;
	}

	public void setFlgLeitura(Character flgLeitura) {
		this.flgLeitura = flgLeitura;
	}

	@Column(name = "flg_gravacao", nullable = false)
	public Character getFlgGravacao() {
		return flgGravacao;
	}

	public void setFlgGravacao(Character flgGravacao) {
		this.flgGravacao = flgGravacao;
	}

	@Column(name = "flg_exclusao", nullable = false)
	public Character getFlgExclusao() {
		return flgExclusao;
	}

	public void setFlgExclusao(Character flgExclusao) {
		this.flgExclusao = flgExclusao;
	}

	@Column(name = "flg_desconto", nullable = false)
	public Character getFlgDesconto() {
		return flgDesconto;
	}

	public void setFlgDesconto(Character flgDesconto) {
		this.flgDesconto = flgDesconto;
	}

	@Transient
	public boolean isSelecionado() {
		return selecionado;
	}

	public void setSelecionado(boolean selecionado) {
		this.selecionado = selecionado;
	}

	@Transient
	public Integer getIdFuncionalidade() {
		return idFuncionalidade;
	}

	public void setIdFuncionalidade(Integer idFuncionalidade) {
		this.idFuncionalidade = idFuncionalidade;
	}

	@Transient
	public boolean isFlgControleTotal() {
		return flgControleTotal;
	}

	public void setFlgControleTotal(boolean flgControleTotal) {
		this.flgControleTotal = flgControleTotal;
	}

	@Transient
	public boolean isLeitura() {
		return leitura;
	}

	public void setLeitura(boolean leitura) {
		this.leitura = leitura;
	}

	@Transient
	public boolean isGravacao() {
		return gravacao;
	}

	public void setGravacao(boolean gravacao) {
		this.gravacao = gravacao;
	}

	@Transient
	public boolean isExclusao() {
		return exclusao;
	}

	public void setExclusao(boolean exclusao) {
		this.exclusao = exclusao;
	}

	@Transient
	public boolean isDesconto() {
		return desconto;
	}

	public void setDesconto(boolean desconto) {
		this.desconto = desconto;
	}

}
